package com.campus.secondhand.service;

import java.math.BigDecimal;
import java.util.Map;

import com.campus.secondhand.common.Result;
import com.campus.secondhand.entity.School;
import com.campus.secondhand.entity.User;
import com.campus.secondhand.model.dto.SearchResultDTO;
import com.campus.secondhand.model.vo.ProductVO;

/**
 * 搜索服务接口
 */
public interface SearchService {

        /**
         * 创建或更新商品索引
         * 
         * @param productId 商品ID
         */
        void createOrUpdateProductIndex(Long productId);

        /**
         * 创建或更新求购信息索引
         * 
         * @param purchaseRequestId 求购信息ID
         */
        void createOrUpdatePurchaseRequestIndex(Long purchaseRequestId);

        /**
         * 创建或更新学校索引
         * 
         * @param schoolId 学校ID
         */
        void createOrUpdateSchoolIndex(Long schoolId);

        /**
         * 创建或更新用户索引
         * 
         * @param userId 用户ID
         */
        void createOrUpdateUserIndex(Long userId);

        /**
         * 综合搜索（包含商品、求购信息、学校、用户）
         * 
         * @param keyword  关键词
         * @param page     页码
         * @param pageSize 每页大小
         * @param sortBy   排序方式
         * @return 综合搜索结果
         */
        Result<SearchResultDTO> search(String keyword, Integer page, Integer pageSize, String sortBy);

        /**
         * 搜索商品
         * 
         * @param keyword    关键词
         * @param page       页码
         * @param pageSize   每页大小
         * @param sortBy     排序方式
         * @param categoryId 分类ID
         * @param schoolId   学校ID
         * @param minPrice   最低价格
         * @param maxPrice   最高价格
         * @return 商品搜索结果
         */
        Result<Map<String, Object>> searchProducts(String keyword, Integer page, Integer pageSize, String sortBy,
                        Long categoryId, Long schoolId, BigDecimal minPrice, BigDecimal maxPrice);

        /**
         * 搜索求购信息
         * 
         * @param keyword    关键词
         * @param page       页码
         * @param pageSize   每页大小
         * @param sortBy     排序方式
         * @param categoryId 分类ID
         * @param schoolId   学校ID
         * @param minBudget  最低预算
         * @param maxBudget  最高预算
         * @return 求购信息搜索结果
         */
        Result<Map<String, Object>> searchPurchaseRequests(String keyword, Integer page, Integer pageSize,
                        String sortBy,
                        Long categoryId, Long schoolId, BigDecimal minBudget, BigDecimal maxBudget);

        /**
         * 搜索学校
         * 
         * @param keyword  关键词
         * @param page     页码
         * @param pageSize 每页大小
         * @return 学校搜索结果
         */
        Result<Map<String, Object>> searchSchools(String keyword, Integer page, Integer pageSize);

        /**
         * 搜索用户
         * 
         * @param keyword  关键词
         * @param page     页码
         * @param pageSize 每页大小
         * @param schoolId 学校ID
         * @return 用户搜索结果
         */
        Result<Map<String, Object>> searchUsers(String keyword, Integer page, Integer pageSize, Long schoolId);

        /**
         * 将所有商品同步到ES
         * 
         * @return 同步结果
         */
        Result<String> syncAllProductsToEs();

        /**
         * 同步所有求购信息到ES
         * 
         * @return 操作结果
         */
        Result<String> syncAllPurchaseRequestsToEs();

        /**
         * 同步所有学校到ES
         * 
         * @return 操作结果
         */
        Result<String> syncAllSchoolsToEs();

        /**
         * 同步所有用户到ES
         * 
         * @return 操作结果
         */
        Result<String> syncAllUsersToEs();
}